/*********************************************************************************************************************
* MSPM0G3507 Opensource Library 即（MSPM0G3507 开源库）是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 MSPM0G3507 开源库的一部分
*
* MSPM0G3507 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即 GNU通用公共许可证）的条款
* 即 GPL 的第3版（即 GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有，请参阅<https://www.gnu.org/licenses/>
*
* 额外注明：
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
*
* 文件名称          mian
* 公司名称          成都逐飞科技有限公司
* 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境          MDK 5.37
* 适用平台          MSPM0G3507
* 店铺链接          https://seekfree.taobao.com/
********************************************************************************************************************/

#include "zf_common_headfile.h"
#include "hardware.h"
#include "init.h"
#include "sensor.h"
#include "drive.h"
#include "string.h"
#include "attitude_algorithm.h"

// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完

// 本例程是开源库空工程 可用作移植或者测试各类内外设
// 本例程是开源库空工程 可用作移植或者测试各类内外设
// 本例程是开源库空工程 可用作移植或者测试各类内外设

// **************************** 代码区域 ****************************


// 全局变量
#define PI 3.1415926
// 串口缓冲
volatile uint8_t receiveData[20];
volatile uint8_t receiveFlag = 0;
volatile uint8 rx_buffer[3], rx_flag = 0;
volatile uint8 command;

// 主函数
int main(void)
{
    clock_init(SYSTEM_CLOCK_80M);   // 时钟配置及系统初始化<务必保留>
    debug_init();                   // 调试串口信息初始化
    // 此处编写用户代码 例如外设初始化代码等
    bee_init();
    motor_init();
    absolute_encoder_init(left_encoder);
    absolute_encoder_init(right_encoder);
    wireless_uart_init();
    servo_init();
    imu660ra_init();

    // 定时中断最后初始化
    inst_init();
    // 此处编写用户代码 例如外设初始化代码等
    while (true)
    {
        // 此处编写需要循环执行的代码
        if (receiveFlag)
        {
            receiveFlag = 0;
        }

        if (rx_flag == 0xff)
        {
            rx_flag = 0x00;
        }

        // 此处编写需要循环执行的代码
    }
}

// 定时中断
void inst_handler(uint32 state, void *ptr)
{
}

// 无线串口接收中断（UART1）
void receive_callback(void)
{
    static uint8_t state = 0;
    static uint8_t arrow = 0;
    uint8_t data = DL_UART_Main_receiveData(UART1);

    // 协议（#COMMAND!）
    if (!receiveFlag)
    {
        if (!state)
        {
            if (data == '#')
            {
                state = 1;
                arrow = 0;
            }
        }
        else
        {
            if (arrow == 19)
            {
                receiveData[arrow] = '\0';
                state = 0;
            }
            else if (data == '!')
            {
                receiveData[arrow] = '\0';
                state = 0;
                receiveFlag = 1;
            }
            else
            {
                receiveData[arrow++] = data;
            }
        }
    }

    // 协议（EBXXXBE）
    switch (rx_flag)
    {
        case 0x00:
            if (data == 'E')
            {
                rx_flag |= 0x80;
            }

            break;

        case 0x80:
            if (data == 'B')
            {
                rx_flag |= 0x40;
            }

            break;

        case 0xc0:
            command = data;
            rx_flag |= 0x20;
            break;

        case 0xe0:
            rx_buffer[0] = data;
            rx_flag |= 0x10;
            break;

        case 0xf0:
            rx_buffer[1] = data;
            rx_buffer[2] = '\0';
            rx_flag |= 0x0c;
            break;

        case 0xfc:
            if (data == 'B')
            {
                rx_flag |= 0x02;
            }

            break;

        case 0xfe:
            if (data == 'E')
            {
                rx_flag |= 0x01;
            }

            break;

        default:
            rx_flag &= 0;
            break;
    }
}